'''
一、定义一个学生Student类。有下面的类属性：
1 姓名 name
2 年龄 age
3 成绩 score（语文，数学，英语) [每课成绩的类型为整数]
类方法：
 1 获取学生的姓名：get_name() 返回类型:str
2 获取学生的年龄：get_age() 返回类型:int
3 返回3门科目中最高的分数。get_course() 返回类型:int
4 将每个实例学生对象写进txt文件里，要持久保存
举例：{"姓名":"a","年龄":29,"成绩":{"语文":99,"数学":100,"英语":85}
5 获取所有学生的信息
写好类以后，可以定义2个同学测试下:
zm = Student('zhangming',20,[69,88,100])

class Student:
    info_student=[]
    def __init__(self,name,age,score):
        self.name = name
        self.age = age
        self.score = {
            score[0],
            score[1],
            score[2]
        }
        Student.info_student.append(self)
        self.save_to_file()
    def get_name(self):
        return self.name
    def get_age(self):
        return self.age
    def get_score(self):
        return max(self.score)
    def save_to_file(self):
        studeht_str=(
            "{"
            f"\"姓名\":\"{self.name}\","
            f"\"年龄\":{self.age},"
            f"\"成绩\":{{\"语文\":{self.score['语文']},\"数学\":{self.score['数学']},\"英语\":{self.score['英语']}}}"
            "}\n"
        )
        with open('infostu.txt','w',encoding='utf-8') as f:
            f.write(studeht_str)
@classmethod
def all_info(cls):
    return [
        {
                "姓名": s.name,
                "年龄": s.age,
                "成绩": s.score
        } for s in cls.all_students
    ]
if __name__ == "__main__":
    zm = Student('zhangming', 20, [69, 88, 100])
    lh = Student('lihua', 19, [92, 78, 95])

    print("张明的姓名：", zm.get_name())  # zhangming
    print("李华的年龄：", lh.get_age())    # 19
    print("张明最高成绩：", zm.get_score())  # 100
    print("李华最高成绩：", lh.get_score())  # 95

    print("\n所有学生信息：")
    for info in Student.all_info():
        print(info)
'''
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

'''
二、定义一个字典类：dictclass。完成下面的功能：
1 删除某个key
2 判断某个键是否在字典里，如果在返回键对应的值，不存在则返回"not found"
3 返回键组成的列表：返回类型;(list)
4 合并字典，并且返回合并后字典的values组成的列表。返回类型:(list)
class dictclass:
    def __init__(self,my_dict=None):
        self.my_dict = my_dict if my_dict is not None else {}
'''
'''
三、定义一个列表的操作类：Listinfo
包括的方法:
1 列表元素添加: add_key(keyname) [keyname:字符串或者整数类型]
2 列表元素取值：get_key(num) [num:整数类型]
3 列表合并：update_list(list) [list:列表类型]
4 删除并且返回最后一个元素：del_key()

class Listinfo:
    def __init__(self):
        self.my_list = []
    def add_key(self,keyname):
        self.my_list.append(keyname)
    def get_key(self,num):
        return self.my_list[num]
    def update_list(self,list):
        self.my_list.extend(list)
    def del_key(self):
        self.my_list.pop()
list_obj=Listinfo()
list_obj.add_key("keyname")
list_obj.add_key(100)
print('索引为0的函数',list_obj.get_key(0)) 
list_obj.update_list([True, 3.14])
print("合并后的列表大致内容：", list_obj.my_list)
last_element = list_obj.del_key()
print("删除的最后一个元素：", last_element)
'''
'''
十三、定义一个人类
1.小明和小美都爱跑步
2.小美体重45.0公斤
3.小明体重75.0公斤
4.每次跑步都会减少0.5公斤
5.每次吃东西都会增加1公斤


'''

'''
十四、士兵瑞恩有一把ak47
士兵可以开火（开火扣动的是扳机）
枪能够发射子弹（把子弹打出去）
抢能够装子弹–增加子弹数量
要求没子弹，需要输出没有子弹了，且发射失败
class human:
    def __init__(self,name,weight):
        self.name = name
        self.weight = weight
        self.hobby='跑步'
    def info(self):
        print(f'{self.name}的体重是{self.weight}，我的爱好是{self.hobby}')
    def run(self):
        self.weight -= 0.5
        print(f'跑步后{self.name}的体重是{self.weight}')
    def eat(self):
        self.weight += 1
        print(f'吃饭后{self.name}的体重是{self.weight}')
t1= human('小美',45)
t2=human('小明',75)
t1.info()
t2.info()
t1.run()
t2.run()
t1.eat()
t2.eat()

'''




# class Person:
#     def __init__(self,name,age):
#         self.name=name
#         self.age=age
#     def introduce(self):
#         print(f'我叫{self.name},我的年龄是{self.age}岁！')
# class student(Person):
#     pass
#
# stu=student('小明',18)
# stu.introduce()


#super()
'''
class person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def introduce(self):
        print(f'我叫{self.name},我的年龄是{self.age}岁！')
class student(person):
    def __init__(self,name,age,score):
        super().__init__(name,age)
        self.score=score
    def study(self):
        print(f'{self.name}正在学习，他的目标成绩是{self.score}')

info=student('小兰',12,100)
info.study()
info.introduce()

class A():
    x=1
class B(A):
    x=2
class C(B):
    pass
obj=C()
print(obj.x)     #C---B----A  x

'''
#组合
'''
class course:
    def __init__(self,name,price):
        self.name = name
        self.price = price
    def info(self):
        print(f'课程:{self.name},价格:{self.price}元')
class teacher:
    def __init__(self,name):
        self.name = name
        self.courses=[]         #列表中存储的是course的对象
    def add_course(self,course):   #course的对象
        self.courses.append(course)
    def show_courses(self):
        print(f'{self.name}的课程有')
        for c in self.courses:
            c.info()
python=course('python编程课程',100)
math=course('高数',200)
teacher=teacher('龙老师')
teacher.add_course(python)
teacher.add_course(math)
teacher.show_courses()

'''
'''

class computer:
    def run(self):
        print(f'电脑正在运行')
class Teacher:
    def __init__(self,name):
        self.name=name
        self.computer=computer()

t=Teacher('白老师')
t.computer.run()




class phone:
    def call(self):
        print('我再给我的朋友打电话')
class person:
    def __init__(self,name):
        self.name=name
        self.phone=phone()

p=person('张三')
p.phone.call()




class animal:
    def __init__(self,voice):
        self.voice=voice
    def speak(self):
        print(f'我的叫声是{self.voice}')
class dog(animal):
    def speak(self):
        print(f'我的叫声是{self.voice}')
class cat(animal):
    def speak(self):
        print(f'我的叫声是{self.voice}')
def make_sound(cat_dog):
    cat_dog.speak()            #主要是调用上面的方法
c=cat('喵喵喵')
b=dog('汪汪汪')
make_sound(c)
make_sound(b)
'''
'''
#魔法方法
class person:
    def __init__(self,name):
      self.name = name
    def __str__(self):
        """
        如果不加入这个str方法输入的是地址值，
        使用这个方法打印的对象是我们定义的信息，像小明
        :return:
        """
        return self.name
p=person('小明')
print(p)
'''
# #__del__对象被删除时执行
# import time
# class Foo:
#     def __init__(self,x,filepath,encoding='utf-8'):
#         self.x=x
#         self.f=open(filepath,'rt',encoding=encoding)
#     def __del__(self):
#         print('__del__正在执行')      # 当对象被销毁时会自动的调用（垃圾回收机制）用于释放内存（关闭文件的操作）
#         self.f.close()              #关闭
# odj=Foo(1,'a.tx')
# print(odj.f.read())


# import time,os
# from selenium import webdriver
# from selenium.webdriver.common.by import By  #todo:引入By方法，做selenium定位
# option = webdriver.ChromeOptions()  # todo：chrome浏览器配置项
# option.add_experimental_option("detach", True)# todo：浏览器不会自动关闭
# bro = webdriver.Chrome(options=option) # todo：实例化driver
# # executable_path：指定driver的路径
# bro.get("https://www.baidu.com/") # todo：打开一个浏览器页面
# bro.maximize_window() # todo：浏览器放大
# #bro.minimize_window() # todo:浏览器缩小
# time.sleep(2) # todo：强制等待2s
# bro.find_element(By.ID, "kw").send_keys("selenium")
# time.sleep(3)
# bro.find_element(By.ID, "su").click()
# time.sleep(3)
# import time
# from selenium import webdriver
# driver=webdriver.Chrome()    #指定浏览器
# time.sleep(1)
# # driver.get('http://www.baidu.com/')    #get:打开网页
# # time.sleep(5)
# path=r'http://www.baidu.com/'
# driver.get(path)
# time.sleep(5)
# # driver.set_window_size(1000,1000)        #设置网页的大小（宽，高）
# driver.maximize_window()                   #设置全屏
# time.sleep(3)
#
# #打开b站
# driver.get('http://www.bilibili.com/')
# time.sleep(5)
# driver.back()                             #回退页面
# time.sleep(2)
#
#
# driver.forward()                          #前进页面
# time.sleep(2)
# driver.close()                            #关闭浏览器
import time
# from selenium import webdriver
# browser=webdriver.Chrome()
# browser.get('http://www.baidu.com')        #打开百度
# print(browser.title)                       #获取标题
# print(browser.current_url)                 #获取网址
# print(browser.name)                        #获取浏览器名称
# print(browser.page_source)                 #获取网页源码
'''
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get('http://www.baidu.com/')
# 定位到搜索框并输入文本
search_box=driver.find_element(by=By.ID, value='chat-textarea')
search_box.send_keys('学习')
#定位到搜索框
search_btn=driver.find_element(by=By.ID, value='chat-button')
#定位到搜索按钮
search_btn.click()
time.sleep(20)
driver.close()
'''
'''
#模拟鼠标的操作，导入actionchains类
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.common.action_chains import ActionChains

driver=webdriver.Chrome()
#设置全屏
driver.maximize_window()
#创建actionchains实例
actions=ActionChains(driver)
driver.get('http://www.baidu.com/')
#用ID定位到设置链接
settings=driver.find_element(by=By.ID, value='s-usersetting-top')
#鼠标悬停操作,鼠标悬停到设置上
actions.move_to_element(settings).perform() 
time.sleep(5)
print('鼠标已经悬停在设置上')
'''
'''
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.common.action_chains import ActionChains

driver=webdriver.Chrome()
driver.get('http://www.baidu.com/')
driver.maximize_window()
time.sleep(5)
#定位到百度的搜索框，输入内容
driver.find_element('id', 'chat-textarea').send_keys('selenium自动化测试')
#定位到百度的搜索框并且按下回车键（代替点击搜索按钮）
driver.find_element('id', 'chat-textarea').send_keys(Keys.ENTER)
time.sleep(5)
'''
'''
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver=webdriver.Chrome()
driver.get('http://www.baidu.com/')
driver.maximize_window()
time.sleep(5)

driver.find_element('id', 'chat-textarea').send_keys('学习是否使人进步？')
#全选
driver.find_element('id', 'chat-textarea').send_keys(Keys.CONTROL,'a')
time.sleep(2)
#复制
# driver.find_element('id', 'chat-textarea').send_keys(Keys.CONTROL,'c')
# time.sleep(2)
#粘贴
# driver.find_element('id', 'chat-textarea').send_keys(Keys.CONTROL,'v')
# time.sleep(5)

driver.close()
'''
'''
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get('http://www.baidu.com/')
#创建WebDriveWait实例，设置最大等待时间10秒，轮询间隔0.5秒
wait=WebDriverWait(driver,timeout=10,poll_frequency=0.05)
#等待元素可见
search_box = wait.until(EC.visibility_of_element_located((By.ID, 'chat-textarea')))
time.sleep(1)
search_btn=wait.until(EC.element_to_be_clickable((By.ID, 'chat-submit-button')))
time.sleep(1)
search_box.send_keys('selenium')
time.sleep(1)
search_btn.click()


input('请按回车键关闭浏览器')
driver.quit()

'''

#
# from selenium.webdriver.support.ui import WebDriverWait
# from selenium.webdriver.support import expected_conditions as EC
# from selenium.webdriver.common.by import By
# from selenium import webdriver
# import time
# driver = webdriver.Chrome()
# driver.get("https://www.baidu.com")
#
# # 创建WebDriverWait实例，设置最大等待时间10秒，轮询间隔0.5秒
# wait = WebDriverWait(driver, timeout=10, poll_frequency=0.5)
#
# # 等待元素可见
# search_box = wait.until(EC.visibility_of_element_located((By.ID, "chat-textarea")))
# time.sleep(2)
# # 等待元素可点击
# search_btn = wait.until(EC.element_to_be_clickable((By.ID, "chat-submit-button")))
# time.sleep(2)
# # 输入搜索词
# search_box.send_keys("Selenium")
# time.sleep(2)
# search_btn.click()
#
# input('请按回车键关闭浏览器')
# driver.quit()
#

# import time
#
# from selenium import webdriver
# from selenium.webdriver.common.by import By
# from selenium.webdriver.common.keys import Keys
# from selenium.webdriver.common.action_chains import ActionChains
# #搜索selenium自动化测试得到网页1，再点击搜索出来的第一个网页得到网页2，在网页2再点击一个地方得到网页3，最后把网页2关掉。
#
# # 1、先进入到百度，并设置为全屏，设置全局等待缓冲6秒
# driver = webdriver.Chrome()
# driver.maximize_window()
# driver.get("https://www.baidu.com")
# driver.implicitly_wait(6)
#
# # 2、先定位到搜索框，输入Selenium自动化测试并按回车
# search_box = driver.find_element(by=By.ID, value="chat-textarea")
# search_box.send_keys("Selenium自动化测试" + Keys.ENTER)
# # time.sleep(3)
#
# # 3、先获取并保存当前（主窗口）的句柄
# main_window_handle = driver.current_window_handle
# print(main_window_handle)
#
# # 4、找到要点击的元素定位，并创建ActionChains实例，再点击一个网页
# search_box2 = driver.find_element(by=By.CLASS_NAME, value='tts-b-hl')
# actions = ActionChains(driver)
# actions.click(search_box2).perform()
#
# # 5、等待新窗口打开，并获取所有窗口句柄（有时候句柄可能不止两个）
# all_handles = driver.window_handles
# #
# # 6. 找到新窗口的句柄
# # 方法A： 循环遍历，找到不是主窗口句柄的那个（当有多个窗口时）
# for handle in all_handles:
#    if handle != main_window_handle:
#        new_window_handle = handle
#        break
# #
# # # 方法B（更简单）： 直接假设新窗口是列表最后一个
# # # new_window_handle = all_handles[-1]
# #
# # 7. 切换到新窗口
# driver.switch_to.window(new_window_handle)
# print(f"已切换到新窗口，标题是: {driver.title}")
# #
# # 8. 切换之后现在可以在新窗口中进行操作了，找到元素并点击
# element_in_new_tab = driver.find_element(By.XPATH, '/html/body/div/div[1]/div/main/nav/ol/li[2]/a')
# element_in_new_tab.click()
# time.sleep(3)
# #
# # 8. 操作完成后，如果需要关闭新窗口并回到主窗口
# driver.close()  # 关闭当前（新）标签页
# driver.switch_to.window(main_window_handle)  # 将控制权交回主窗口
# print(f"已切换回主窗口，标题是: {driver.title}")
#
# input("按回车键关闭浏览器")  # 等待用户输入
# driver.quit()


import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

driver=webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com/')

original_window = driver.current_window_handle   #记住当前页面的编号original_window

search_box = driver.find_element(by=By.ID, value="chat-textarea")
search_box.send_keys("帅到惊动联合国" + Keys.ENTER)
time.sleep(3)
search_box2 = driver.find_element(by=By.CLASS_NAME, value='tts-b-hl')
actions = ActionChains(driver)
actions.click(search_box2).perform()
driver.get('http://www.baidu.com/')

driver.switch_to.window(original_window)  #使用这个编号original_window 使焦点回到这个编号所在的页面

time.sleep(3)
search_box = driver.find_element(by=By.ID, value="chat-textarea")
search_box.send_keys("洛神赋" + Keys.ENTER)
print(driver.page_source)
with open('source.txt','w',encoding='utf-8') as f:
    f.write(driver.page_source)
print('源码已经保存到source.txt')


input('按住回车键结束')
driver.quit()
